/*
 * utils.h
 *
 *  Created on: Apr 5, 2010
 *      Author: nguyencao
 */

#ifndef UTILS_H_
#define UTILS_H_
#include "common.h"

void init(INTEGER i);

// init an integer and assign an integer value
void init2(INTEGER i, int v);

// ADD:  C = A + B
void add(INTEGER a, INTEGER b, INTEGER c) ;

// ADD:  C = A + B
void add2(INTEGER a, int b, INTEGER c) ;

// a = b
void set(INTEGER a, INTEGER b);

// a = b
void set2(INTEGER a, int b);

void set3(int* a, INTEGER b);

void clear(INTEGER c);

// SUB: C = A - B
void sub(INTEGER a, INTEGER b, INTEGER c);

// SUB: C = A - B
void sub2(INTEGER a, int b, INTEGER c) ;

// a = b (mod c)
// Set a to b mod c. The sign of the divisor is ignored; the result is always non-negative
void mod(INTEGER a, INTEGER b, INTEGER c) ;

// a = b (mod c)
// Set a to b mod c. The sign of the divisor is ignored; the result is always non-negative
int mod2(INTEGER a, int b) ;

// C = A*B
void mul(INTEGER a, INTEGER b, INTEGER c) ;

// C = A*B
void mul2(INTEGER a, int b, INTEGER c);

// C = A/B
void div3(INTEGER a, INTEGER b, INTEGER c, INTEGER d) ;

// C = A/B
void div2(INTEGER a, int b, INTEGER c) ;

// A = B*q + r
void div_qr(INTEGER a, int b, INTEGER q, int *r) ;
// a = b
void mcopy(INTEGER a, INTEGER b);
// c = b^n
void mpow(int b, int n, INTEGER c) ;

// if a > b return 1 , else if a = b return 0, else -1
int compare(INTEGER a, INTEGER b) ;

// if a > b return 1 , else if a = b return 0, else -1
int compare2(INTEGER a, int b);

// c = a & b
void bitwiseAND(INTEGER a, INTEGER b, INTEGER c) ;

// c = a & b
void bitwiseAND2(INTEGER a, int b, INTEGER c);

void bitwiseOR(INTEGER c, INTEGER a, INTEGER b);

void bitwiseXOR(INTEGER c, INTEGER a, INTEGER b);

// c = abs(b)
void abs2(INTEGER c, INTEGER b);

// c = -b
void negative(INTEGER c, INTEGER b);

void gcd(INTEGER c, INTEGER a, INTEGER b);

// Return the number of digits of the large integer a
int size2(INTEGER a);

int gcd1(int u, int v);

#endif /* UTILS_H_ */
